<template>
  <div style="padding: 12px 15px 15px; background-color: #fff">
    <px-form v-show="showSearch" ref="queryRef" :model="queryParams" inline class="custom-form-ui-new" label-width="68px" label-position="right">
      <px-form-item label="操作地址" prop="operIp">
        <px-input v-model="queryParams.operIp" placeholder="请输入操作地址" clearable style="width: 240px" @keyup.enter="handleQuery" />
      </px-form-item>
      <px-form-item label="系统模块" prop="title">
        <px-input v-model="queryParams.title" placeholder="请输入系统模块" clearable style="width: 240px" @keyup.enter="handleQuery" />
      </px-form-item>
      <px-form-item label="操作人员" prop="operName">
        <px-input v-model="queryParams.operName" placeholder="请输入操作人员" clearable style="width: 240px" @keyup.enter="handleQuery" />
      </px-form-item>
      <px-form-item label="类型" prop="businessType">
        <px-select v-model="queryParams.businessType" placeholder="操作类型" clearable style="width: 240px">
          <px-option v-for="dict in sys_oper_type" :key="dict.value" :label="dict.label" :value="dict.value" />
        </px-select>
      </px-form-item>
      <px-form-item label="状态" prop="status">
        <px-select v-model="queryParams.status" placeholder="操作状态" clearable style="width: 240px">
          <px-option v-for="dict in sys_common_status" :key="dict.value" :label="dict.label" :value="dict.value" />
        </px-select>
      </px-form-item>
      <px-form-item label="操作时间" style="width: 308px">
        <px-date-picker
          v-model="dateRange"
          value-format="YYYY-MM-DD HH:mm:ss"
          type="daterange"
          range-separator="-"
          start-placeholder="开始日期"
          end-placeholder="结束日期"
          :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"
        />
      </px-form-item>
      <px-form-item>
        <px-button type="primary" icon="" @click="handleQuery">搜索</px-button>
        <px-button icon="" @click="resetQuery">重置</px-button>
      </px-form-item>
    </px-form>

    <px-row :gutter="10" class="mb8">
      <!-- <px-col :span="1.5">
        <px-button
          type="danger"
          plain
          icon=""
          :disabled="multiple"
          @click="handleDelete"
          >删除</px-button
        >
      </px-col> -->
      <!-- <px-col :span="1.5">
        <px-button type="danger" plain icon="" @click="handleClean"
          >清空</px-button
        >
      </px-col> -->
      <px-col :span="1.5">
        <px-button v-has="'IFP_OPERATE_LOG'" plain @click="handleExport">导出</px-button>
      </px-col>
      <!-- <right-toolbar
        v-model:showSearch="showSearch"
        @queryTable="getList"
      ></right-toolbar> -->
    </px-row>
    <px-table
      ref="operlogRef"
      v-loading="loading"
      :header-cell-style="{ background: '#e7eefb', color: '#000' }"
      :data="operlogList"
      border
      @selection-change="handleSelectionChange"
    >
      <px-table-column type="selection" width="50" align="center" />
      <px-table-column label="日志编号" align="center" prop="operId" />
      <px-table-column label="系统模块" align="center" prop="title" :show-overflow-tooltip="true" />
      <px-table-column label="操作类型" align="center" prop="businessTypeLabel">
        <!-- <template #default="scope"> -->
        <!-- <dict-tag :options="sys_oper_type" :value="scope.row.businessType" /> -->
        <!-- <px-tag>{{ sys_oper_type.filter((item) => item.value == scope.row.businessType).label}}</px-tag> -->
        <!-- </template> -->
      </px-table-column>
      <px-table-column
        label="操作人员"
        align="center"
        width="110"
        prop="operName"
        :show-overflow-tooltip="true"
        sortable="custom"
        :sort-orders="['descending', 'ascending']"
      />
      <px-table-column label="操作地址" align="center" prop="operIp" width="130" :show-overflow-tooltip="true" />
      <px-table-column label="操作状态" align="center" prop="status">
        <template #default="scope">
          <px-tag :type="scope.row.status == '0' ? '' : 'danger'">{{ scope.row.status == "0" ? "正常" : "失败" }}</px-tag>
        </template>
      </px-table-column>
      <!-- <px-table-column
        label="操作日期"
        align="center"
        prop="operTime"
        width="180"
        sortable="custom"
        :sort-orders="['descending', 'ascending']"
      >
        <template #default="scope">
          <span>{{ parseTime(scope.row.operTime) }}</span>
        </template>
      </px-table-column> -->
      <px-table-column label="操作日期" align="center" prop="operTime" width="180" />
      <px-table-column label="消耗时间" align="center" prop="costTime" width="110" :show-overflow-tooltip="true">
        <template #default="scope">
          <span>{{ scope.row.costTime }}毫秒</span>
        </template>
      </px-table-column>
      <px-table-column label="操作" align="center" class-name="small-padding fixed-width">
        <template #default="scope">
          <px-tooltip content="详细">
            <px-button link type="primary" icon="Tickets" @click="handleView(scope.row)" />
          </px-tooltip>
        </template>
      </px-table-column>
    </px-table>

    <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" />

    <!-- 操作日志详细 -->
    <px-dialog v-model="open" title="操作日志详细" width="800px" append-to-body>
      <px-descriptions border :column="2">
        <px-descriptions-item label="日志编号：">{{ form.operId }}</px-descriptions-item>
        <px-descriptions-item label="操作模块：">{{ form.title }}</px-descriptions-item>
        <px-descriptions-item label="登录信息：">{{ form.operName }} / {{ form.operIp }}</px-descriptions-item>
        <px-descriptions-item label="操作地址：">{{ form.operIp }}</px-descriptions-item>
        <px-descriptions-item label="操作类型：">{{ switchType(form.businessType) }}</px-descriptions-item>
        <!-- <px-col :span="24">
            <<px-descriptions-item label="操作方法：">{{ form.method }}</<px-descriptions-item>
          </px-col> -->
        <!-- <px-col :span="24">
            <<px-descriptions-item label="请求参数：">{{ form.operParam }}</<px-descriptions-item>
          </px-col> -->
        <!-- <px-col :span="24">
            <<px-descriptions-item label="返回参数：">{{
              form.jsonResult
            }}</<px-descriptions-item>
          </px-col> -->
        <px-descriptions-item label="操作状态：">
          {{ form.status == "0" ? "正常" : "失败" }}
        </px-descriptions-item>
        <px-descriptions-item label="操作日期：">{{ form.operTime }}</px-descriptions-item>
        <px-descriptions-item label="消耗时间：">{{ form.costTime }}毫秒</px-descriptions-item>
        <!-- <px-col :span="24">
            <px-form-item v-if="form.status == '1'" label="异常信息：">{{
              form.errorMsg
            }}</px-form-item>
          </px-col> -->
      </px-descriptions>
      <template #footer>
        <div class="dialog-footer">
          <px-button @click="open = false">关 闭</px-button>
        </div>
      </template>
    </px-dialog>
  </div>
</template>

<script setup lang="ts">
import { list } from "@/api/system/monitor/operlog";
import { getCurrentInstance, reactive, ref, toRefs } from "vue";

const { proxy }: any = getCurrentInstance();
const sys_common_status = ref([
  {
    label: "正常",
    value: "0"
  },
  {
    label: "失败",
    value: "1"
  }
]);
const sys_oper_type = ref([
  {
    label: "其他",
    value: 0
  },
  {
    label: "新增",
    value: 1
  },
  {
    label: "修改",
    value: 2
  },
  {
    label: "删除",
    value: 3
  },
  {
    label: "授权",
    value: 4
  },
  {
    label: "导出",
    value: 5
  },
  {
    label: "导入",
    value: 6
  },
  {
    label: "强退",
    value: 7
  },
  {
    label: "生成代码",
    value: 8
  },
  {
    label: "清空",
    value: 9
  }
]);
const switchType = (val: number) => {
  const types = sys_oper_type.value.filter(item => item.value == val);
  if (types.length > 0) {
    return types[0].label;
  }
  return 0;
};
// const { sys_oper_type, sys_common_status } = proxy.useDict(
//   "sys_oper_type",
//   "sys_common_status"
// );

const operlogList = ref([]);
const open = ref(false);
const loading = ref(false);
const showSearch = ref(true);
const total = ref(0);
const ids = ref([]);
const multiple = ref(true);
const dateRange = ref([]);

const data = reactive({
  form: {
    operId: "",
    operName: "",
    operIp: "",
    title: "",
    businessType: 0,
    status: "",
    operTime: "",
    costTime: ""
  },
  queryParams: {
    pageNum: 1,
    pageSize: 10,
    operIp: undefined,
    title: undefined,
    operName: undefined,
    businessType: undefined,
    status: undefined
  }
});

const { queryParams, form } = toRefs(data);

/** 查询登录日志 */
function getList() {
  loading.value = true;
  list(proxy.addDateRange(queryParams.value, dateRange.value)).then((response: any) => {
    operlogList.value = response.data;
    total.value = response.total;
    loading.value = false;
  });
}
/** 操作日志类型字典翻译 */
function typeFormat(row, column) {
  // return proxy.selectDictLabel(sys_oper_type.value, row.businessType);
}
/** 搜索按钮操作 */
function handleQuery() {
  queryParams.value.pageNum = 1;
  getList();
}
/** 重置按钮操作 */
function resetQuery() {
  dateRange.value = [];
  proxy.resetForm("queryRef");
  // proxy.$refs["operlogRef"].sort(
  //   defaultSort.value.prop,
  //   defaultSort.value.order
  // );
  handleQuery();
}
/** 多选框选中数据 */
function handleSelectionChange(selection) {
  ids.value = selection.map(item => item.operId);
  multiple.value = !selection.length;
}
/** 排序触发事件 */
function handleSortChange(column, prop, order) {
  // queryParams.value.orderByColumn = column.prop;
  // queryParams.value.isAsc = column.order;
  // getList();
}
/** 详细按钮操作 */
function handleView(row) {
  open.value = true;
  form.value = row;
}
/** 删除按钮操作 */
function handleDelete(row) {
  // const operIds = row.operId || ids.value;
  // proxy.$modal
  //   .confirm('是否确认删除日志编号为"' + operIds + '"的数据项?')
  //   .then(function () {
  //     return delOperlog(operIds);
  //   })
  //   .then(() => {
  //     getList();
  //     proxy.$modal.msgSuccess("删除成功");
  //   })
  //   .catch(() => {});
}
/** 清空按钮操作 */
function handleClean() {
  // proxy.$modal
  //   .confirm("是否确认清空所有操作日志数据项?")
  //   .then(function () {
  //     return cleanOperlog();
  //   })
  //   .then(() => {
  //     getList();
  //     proxy.$modal.msgSuccess("清空成功");
  //   })
  //   .catch(() => {});
}
/** 导出按钮操作 */
function handleExport() {
  const params = {
    operIds: ids.value,
    ...queryParams.value
  };
  proxy.download("post", "/account/api/v1/sys/operlog/export", proxy.addDateRange(params, dateRange.value), `操作日志_${new Date().getTime()}`);
}

getList();
</script>
